Skip to content

docs: add 2B KRW sale readiness roadmap#61

Open
seonghobae wants to merge 26 commits into
developfrom
productize-20b-roadmap
Open

docs: add 2B KRW sale readiness roadmap#61
seonghobae wants to merge 26 commits into
developfrom
productize-20b-roadmap

Conversation

@seonghobae

@seonghobae seonghobae commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add a concrete 2B KRW / 20억 KRW sale-readiness execution plan for kaefa
  • document why the next phase should keep one repo with explicit kaefa-core, kaefa-studio, and kaefa-runner boundaries instead of introducing a submodule now
  • document the kaefa-core pilot-facing API contract and exported-helper cleanup policy
  • replace the placeholder LICENSE with GPL-3 text and document license/IP diligence risk, runtime dependency licenses, and working commercial posture
  • add a buyer-facing data room index, ContextualWisdomLab resource map, release diligence checklist, pilot evidence templates, benchmark manifest/protocol, commercial model, and pilot scorecard
  • add a pinned test-fast GitHub Actions gate for manifest, Shiny product-surface, and core API contracts
  • harden productization tests so the core API contract reads installed namespace exports and the benchmark manifest fails on non-numeric range fields
  • improve the Shiny Studio report surface with invalid-column errors and reproducibility metadata
  • add a local Studio deployment package: Dockerfile, .dockerignore, ShinyProxy example, and deployment guide
  • link and update the FigJam roadmap created without Figma Code Connect: https://www.figma.com/board/yGly1YSL1InCPRUrBW2p03
  • add the FigJam kaefa 2B KRW Productization Architecture flow and align data-room wording with runtime-code container evidence
  • clarify that runtime-code smoke evidence and release-candidate signoff evidence are separate, so buyer-facing docs do not imply stale commits are the current release head

Validation

  • Current PR head: f44d0aa6f922303abafc9f5da152c33ec0b8c63f
  • Latest docs-only validation for f44d0aa:
    • npx -y markdownlint-cli2@0.20.0 docs/diligence/contextualwisdomlab-resource-map.md
    • git diff --check
    • rg -n 'Current head audited|Current evidence:|current-head image must be rebuilt|smoke tested again|taking too long|rerun to completion|rebuild needs rerun|smoke evidence must be rerun|Container rebuild needs rerun|Current-head smoke needs rerun' docs returned no matches
    • git diff --name-only b5bfdb8b509eb8ec06f143c6435f880eda3d2e20..HEAD shows only docs/test files changed after the runtime-code smoke commit; no Dockerfile, DESCRIPTION, R/, or inst/shiny-app/ runtime files changed in that range
  • Runtime-code container and Studio smoke evidence captured earlier in this PR:
    • podman build -t kaefa-studio:local . completed with exit code 0 and produced image 47f328553868
    • podman run --rm -d --name kaefa-studio-smoke -p 127.0.0.1:3838:3838 kaefa-studio:local
    • curl http://127.0.0.1:3838/ returned HTTP 200, 12,017 bytes, and title kaefa: Automated Exploratory Factor Analysis
    • container logs included Listening on http://0.0.0.0:3838
    • release-candidate smoke should still be rerun on the target release commit before buyer handoff
  • Local package/test validation captured earlier in this PR:
    • R CMD INSTALL .
    • Rscript - <<'RSCRIPT' with StopReporter for test-benchmark-manifest.R, test-shiny-product-surface.R, and test-core-api-contract.R
    • observed: benchmark manifest 11 successes; Shiny surface 3, 5, and 2 successes; core API contract 2 successes
  • Earlier code-bearing validation in this PR:
    • Rscript -e 'testthat::test_file("tests/testthat/test-benchmark-manifest.R")'
    • Rscript -e 'testthat::test_file("tests/testthat/test-shiny-product-surface.R")'
    • ruby -e 'require "yaml"; YAML.load_file("deploy/shinyproxy/application.yml.example"); puts "shinyproxy yaml ok"'
    • Rscript -e 'read.csv("inst/benchmarks/manifest.csv", stringsAsFactors = FALSE); cat("manifest csv ok\n")'
    • Shiny app parse, workflow YAML parse, dependency license query, and markdownlint across the added diligence/product docs

Notes

  • Review approval is intentionally not treated as a productization blocker.
  • Queued GitHub checks are monitoring state, not a productization blocker.
  • Broken CI, failing reproducible tests, missing runtime dependencies, and missing license/IP authority remain real blockers.
  • shiny, DT, and fitdistrplus are in Imports, and the runtime-code container smoke confirms kaefa::launchAEFA() starts successfully in the image.
  • actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd was checked against the official actions/checkout tags and corresponds to v6.0.2.
  • Figma Code Connect was not used.
  • Normal merge was attempted on head f44d0aa6f922303abafc9f5da152c33ec0b8c63f; base branch policy prohibits it, and repository auto-merge is disabled (enablePullRequestAutoMerge).

Copilot AI review requested due to automatic review settings July 2, 2026 06:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds new documentation to guide “sale readiness” work for kaefa, focusing on productization planning and upfront license/IP diligence posture to support buyer due diligence.

Changes:

  • Added a detailed execution roadmap for “sale readiness” work (license posture, CI gates, benchmarks, UI boundary, deployment, revenue evidence, diligence bundle).
  • Added a standalone license/IP diligence note describing current license metadata risk and a conservative commercial posture pending owner/legal review.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

File Description
docs/superpowers/plans/2026-07-02-kaefa-20b-sale-readiness.md New sale-readiness execution plan/roadmap covering productization tasks and sequencing.
docs/diligence/license-and-ip.md New diligence note documenting current license-file mismatch risk and dependency/license constraints.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/superpowers/plans/2026-07-02-kaefa-20b-sale-readiness.md Outdated
Comment thread docs/superpowers/plans/2026-07-02-kaefa-20b-sale-readiness.md Outdated
Comment thread docs/superpowers/plans/2026-07-02-kaefa-2b-krw-sale-readiness.md
Copilot AI review requested due to automatic review settings July 2, 2026 06:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 2 comments.

Comment thread tests/testthat/test-benchmark-manifest.R Outdated
Comment thread .github/workflows/test-fast.yaml
Copilot AI review requested due to automatic review settings July 2, 2026 06:57

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated 6 comments.

Comment thread tests/testthat/test-benchmark-manifest.R Outdated
Comment thread inst/benchmarks/manifest.csv Outdated
Comment thread deploy/shinyproxy/application.yml.example
Comment thread docs/superpowers/plans/2026-07-02-kaefa-20b-sale-readiness.md Outdated
Copilot AI review requested due to automatic review settings July 2, 2026 07:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@opencode-agent

opencode-agent Bot commented Jul 2, 2026

Copy link
Copy Markdown

OpenCode Review Overview

  • Head SHA: bb5974762e9eed55e08d5643df7331d8d7599732
  • Workflow run: 28569545343
  • Workflow attempt: 1
  • Gate result: APPROVE (exit 0)

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (10 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (10 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Workflow: test-fast.yaml"]
  S2 --> I2["GitHub Actions review job"]
  I2 --> R2["Review risk: Workflow: test-fast.yaml"]
  R2 --> V2["actionlint plus required checks"]
  Evidence --> S3["Docs (9 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (9 files)"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test (4 files)"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test (4 files)"]
  R4 --> V4["targeted test run"]
Loading

@seonghobae seonghobae changed the title docs: add 20B KRW sale readiness roadmap docs: add 2B KRW sale readiness roadmap Jul 2, 2026
Copilot AI review requested due to automatic review settings July 2, 2026 10:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 24 out of 24 changed files in this pull request and generated 8 comments.

Comment thread tests/testthat/test-shiny-product-surface.R
Comment thread tests/testthat/helper-test-data.R Outdated
Comment thread .github/workflows/test-fast.yaml
Comment thread docs/business/pilot-scorecard.md
Comment thread docs/business/2b-krw-commercial-model.md
Comment thread Dockerfile Outdated
Comment thread tests/testthat/test-benchmark-manifest.R
Comment thread inst/shiny-app/app.R Outdated
@seonghobae

Copy link
Copy Markdown
Collaborator Author

CI gate follow-up (2026-07-02 20:58Z)

Required opencode-review failed on previous head 97e0eec after the OpenCode model pool timed out while processing unresolved review evidence. I pushed fad8aab to address the actionable review inputs and reduce the gate burden:

  • install the package before the fast test workflow runs testthat::test_file(...)
  • avoid helper-load namespace skips for tests that do not need the package namespace
  • make Shiny source tests skip early when the app source is unavailable
  • reject impossible benchmark factor ranges relative to item counts
  • record Shiny report timestamps in UTC ISO-8601 form
  • derive Docker runtime R package dependencies from DESCRIPTION

Live status now: PR head is fad8aab; checks for the new head are queued/in progress, with no new failed logs yet. I will continue monitoring the required checks and will not reset CI with extra commits unless a required check fails with actionable evidence.

Copilot AI review requested due to automatic review settings July 2, 2026 21:40
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Core API contract update pushed.

  • Added docs/product/kaefa-core-api-contract.md from the current NAMESPACE and R entry points.
  • Marked pilot-facing functions, runner/studio boundaries, advanced engine exports, theta-prior helper maturity, and dot-prefixed export cleanup candidates.
  • Linked the contract from the data room index and repository-boundary decision.
  • Local verification: git diff --check; npx -y markdownlint-cli2@0.20.0 docs/product/kaefa-core-api-contract.md docs/diligence/repository-boundary-decision.md docs/diligence/data-room-index.md.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 29 out of 29 changed files in this pull request and generated 6 comments.

Comment thread Dockerfile Outdated
Comment thread tests/testthat/test-shiny-product-surface.R
Comment thread inst/shiny-app/app.R Outdated
Comment thread inst/shiny-app/app.R Outdated
Comment thread inst/shiny-app/app.R Outdated
Comment thread inst/shiny-app/app.R Outdated
Copilot AI review requested due to automatic review settings July 2, 2026 21:57
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Fast gate API-contract update pushed.

  • Added tests/testthat/test-core-api-contract.R to pin pilot-facing exports and dot-prefixed cleanup candidates against docs/product/kaefa-core-api-contract.md.
  • Added the test to .github/workflows/test-fast.yaml and tests/FAST_TESTS.md.
  • Local verification: Rscript -e 'testthat::test_file("tests/testthat/test-core-api-contract.R")'; workflow-equivalent Rscript - <<'RSCRIPT' fast bundle; git diff --check; markdownlint for tests/FAST_TESTS.md and the API contract; YAML parse for test-fast.yaml.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 30 out of 30 changed files in this pull request and generated 2 comments.

Comment thread Dockerfile Outdated
Comment thread tests/testthat/test-shiny-product-surface.R
Copilot AI review requested due to automatic review settings July 2, 2026 22:14
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Review-followup update pushed.

  • Replaced Dockerfile DESCRIPTION hand parsing with remotes::install_deps() for Depends/Imports/LinkingTo resolution.
  • Added package-level Shiny helper functions for invalid-column validation and report metadata formatting, then updated test-shiny-product-surface.R to test those helpers directly.
  • Centralized Studio state clearing through clearAnalysisState() so data/results/runOptions/analysisComplete are reset in one place.
  • Local verification passed: R parse for R/shiny_helpers.R and inst/shiny-app/app.R; git diff --check; workflow YAML parse; markdownlint for touched docs; R CMD INSTALL .; Rscript -e 'testthat::test_file("tests/testthat/test-shiny-product-surface.R")'; workflow-equivalent fast bundle.
  • Container build note: podman build -t kaefa-studio:local . reached the new remotes::install_deps() path and CRAN package compilation, then I interrupted it because a clean source build of the full R/Shiny/mirt dependency graph was taking too long. I am not counting that as a passing container build.

@seonghobae

Copy link
Copy Markdown
Collaborator Author

Additional review follow-up pushed.

  • Updated test-shiny-product-surface.R to locate the installed Shiny app with system.file("shiny-app", "app.R", package = "kaefa") first, then use repo-relative fallback for local development.
  • Missing Shiny product-surface source is now a test failure instead of a silent skip.
  • Re-ran Rscript -e 'testthat::test_file("tests/testthat/test-shiny-product-surface.R")', the workflow-equivalent fast bundle, and git diff --check; all passed.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 3 comments.

Comment thread Dockerfile Outdated
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Comment thread tests/testthat/test-core-api-contract.R Outdated
Copilot AI review requested due to automatic review settings July 2, 2026 22:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

tests/testthat/test-shiny-product-surface.R:1

  • testthat::fail() records a failure but does not abort the test; returning NULL here can lead to a hard error later (e.g., readLines(app_path) with NULL). Prefer testthat::skip() (if it's acceptable to skip when missing) or stop() (if missing is truly fatal), or make callers explicitly guard on NULL/NA before reading the file.

return(invisible(NULL))
}

manifest <- read.csv(manifest_path, stringsAsFactors = FALSE)
Comment on lines +44 to +50
expect_true(all(manifest$rows > 0))
expect_true(all(manifest$items > 0))
expect_true(all(manifest$expected_factor_min >= 1))
expect_true(all(manifest$expected_factor_min <= manifest$items))
expect_true(all(manifest$expected_factor_max >= manifest$expected_factor_min))
expect_true(all(manifest$expected_factor_max <= manifest$items))
expect_true(all(manifest$expected_runtime_seconds > 0))
Comment thread Dockerfile

COPY DESCRIPTION /opt/kaefa/DESCRIPTION

RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")'
Comment thread Dockerfile

EXPOSE 3838

CMD ["Rscript", "-e", "kaefa::launchAEFA(host = '0.0.0.0', port = 3838)"]
Copilot AI review requested due to automatic review settings July 2, 2026 23:06

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (2)

tests/testthat/test-shiny-product-surface.R:1

  • These assertions depend on raw string matching against inst/shiny-app/app.R, including a hard-coded expectation that a specific assignment occurs exactly once. This is brittle (minor formatting/refactor changes will break the test without a behavior change). Prefer asserting behavior via unit tests of the helper functions (already done for invalid columns/metadata) and, for server logic, consider shiny::testServer()/module-level tests or extracting state-reset logic into a helper that’s tested directly.
    tests/testthat/test-shiny-product-surface.R:1
  • These assertions depend on raw string matching against inst/shiny-app/app.R, including a hard-coded expectation that a specific assignment occurs exactly once. This is brittle (minor formatting/refactor changes will break the test without a behavior change). Prefer asserting behavior via unit tests of the helper functions (already done for invalid columns/metadata) and, for server logic, consider shiny::testServer()/module-level tests or extracting state-reset logic into a helper that’s tested directly.

Comment thread Dockerfile
@@ -0,0 +1,28 @@
FROM r-base:4.4.2
Comment thread Dockerfile

COPY DESCRIPTION /opt/kaefa/DESCRIPTION

RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")'
Copilot AI review requested due to automatic review settings July 2, 2026 23:23

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 3 comments.

Comment thread Dockerfile
Comment on lines +1 to +3
FROM r-base:4.4.2

ENV R_REPOS=https://cloud.r-project.org
Comment thread Dockerfile

COPY DESCRIPTION /opt/kaefa/DESCRIPTION

RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")'
Comment on lines +1 to +13
repo_file <- function(...) {
repo_paths <- c(
file.path(...),
file.path("..", "..", ...)
)
repo_path <- repo_paths[file.exists(repo_paths)][1]

if (is.na(repo_path) || !nzchar(repo_path)) {
testthat::skip(paste("repository file not found:", file.path(...)))
}

repo_path
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants